第四章 Linux环境


程序参数

一个C语言程序从 main 函数开始,它的声明如:

int main(int argc, char *argv[]);

其中, argc 是程序的参数的个数, argv 是程序的参数列表。

这些参数通常由 shell 提供。例如,在 shell 中执行程序 myprog :

$ myprog left right 'and center'

那么 argc 为4,而 argv 是 { "myprog", "left", "right", "and center", NULL };

getopt

程序参数有一定的准则,比如:以 - 开头的,叫选项,后面可以跟着一个关联值。为了方便应用这样的准则, Linux 提供了 getopt 函数,它可以抓取选项和选项的值。

getopt_long

getopt 不能够处理 -- 这样的长选项,这样的选项可以交给 getopt_long 处理。

环境变量

环境变量是一些能用来控制 shell 脚本和其他程序行为的变量。比如,每一个用户都有一个环境变量 HOME ,代表用户家目录,它是用户会话开始时候的默认目录。

通过 getenv 和 putenv 可以获取/设置当前程序的环境变量。

环境变量的用途

程序经常使用环境变量来改变它们的工作方式。可以这样把环境变量 FRED 传递给一个程序 program :

$ FRED=hello ./program

也可以这样:

$ FRED=hello; export FRED
$ ./program

Warning

环境变量就像全局变量一样,会使得程序的调试变得困难。

envrion 变量

每一个环境由一组格式为 "名字=值" 的字符串组成。这些字符串可以通过 environ 变量访问,它是一个全局的字符串数组,并以空指针结尾。

时间和日期

所有的 UNIX 系统都使用同一个时间和日期的起点:格林尼治时间(GMT)1970年1月1日0点。

时间通过一个预定义的类型 time_t 来处理。在 Linux 中,它是一个长整型。

通过 time 函数可以获取当前的底层时间值。

时间值可以转换成一个分解结构,包含了更加详细的时间信息。

通过 gmtime 和 localtime 可以获取这个结构。

通过 mktime 可以将分解时间转换回底层时间值。

更快速地获取到友好的时间字符串表示,可以使用 asctime ctime strftime 。

临时文件

很多情况下,程序会利用一些临时文件作为临时存储手段。必须要保证临时文件的文件名是唯一的,不然多个程序直接用到同一个文件就会相互干扰。

通过 tmpnam 可获取一个唯一的文件名。

通过 tmpfile 可以打开一个临时文件,这个文件会在所有引用关闭时被自动删除。

但 GNU C编译器会对 tmpnam 给出警告信息。

UNIX 还提供了另一种生成临时文件名的方式,就是使用 mktemp 和 mkstemp 函数。

用户信息

除了 init 程序,所有的 Linux 程序都是由其他程序或用户启动的。

用户通常是在一个响应他们命令的 shell 中启动程序。程序也可以发现它的使用者的相关信息。

一个用户登进 Linux 系统,需要一个用户名和密码,用户名还关联着一个唯一的标识符 UID 。

使用 getuid 可以获取程序关联的 UID ,使用 getlogin 获取的是用户名。它们通常是启动程序的用户。

用户的账号数据库是文件 /etc/passwd 。这是一个普通用户不能读取的文件,但可以通过编程接口访问,也就是通过 getpwuid 或 getpwnam 。

主机信息

程序还可以获得运行它的计算机的有关细节。 uname 命令就可以直接获取。比如 uname -a

系统提供了同名的C接口,获取同样的信息。

gethostname 获取了主机的网络名。

日志

许多应用程序需要记录它们的活动。系统程序经常需要向控制台或日志文件写消息。

日志文件有:

通过查看 /etc/syslog.conf 或 /etc/syslog-ng/sys-log-ng.conf 文件来检查系统配置。

Note

在 CentOS 7上面没有发现这个系统配置。

通过 syslog 函数可以写这样的日志。

通过 closelog openlog setlogmask 可以改变日志信息的表述方式。

资源限制

Linux 系统上运行的程序会受到资源限制的影响。比如内存、文件数量、文件名长度等。

头文件 limits.h 中定义了许多操作系统方面限制的常量。比如 NAME_MAX CHAR_BIT INT_MAX 。

头文件 sys/resource.h 提供了资源操作方面的定义,其中包括对程序长度、执行优先级和文件资源等方面限制进行查询和设置的函数: